/**
 * @p.md
 * 
 * Process 模块，定义 Actor 进程接口
 */
import { PID } from './pid';

/**
 * 进程接口，定义了 Actor 交互的基本契约
 */
export interface Process {
  /**
   * 发送用户消息
   * @param pid 接收消息的 PID
   * @param message 消息内容
   */
  sendUserMessage(pid: PID, message: any): void;
  
  /**
   * 发送系统消息
   * @param pid 接收消息的 PID
   * @param message 系统消息内容
   */
  sendSystemMessage(pid: PID, message: any): void;
  
  /**
   * 停止进程
   * @param pid 要停止的 PID
   */
  stop(pid: PID): void;
}

/**
 * 判断对象是否实现了 Process 接口
 * @param obj 待检查对象
 * @returns 是否为 Process 实例
 */
export function isProcess(obj: any): obj is Process {
  return obj && 
    typeof obj.sendUserMessage === 'function' && 
    typeof obj.sendSystemMessage === 'function' && 
    typeof obj.stop === 'function';
}

/**
 * 停止消息，用于停止 Actor
 */
export interface Stop {
  type: 'Stop';
}

/**
 * 判断消息是否为停止消息
 * @param message 要检查的消息
 */
export function isStop(message: any): message is Stop {
  return message && message.type === 'Stop';
}

/**
 * Actor 启动消息
 */
export interface Started {
  type: 'Started';
}

/**
 * 判断消息是否为启动消息
 * @param message 要检查的消息
 */
export function isStarted(message: any): message is Started {
  return message && message.type === 'Started';
}

/**
 * 重启消息，用于重启 Actor
 */
export interface Restart {
  type: 'Restart';
  reason?: Error;
}

/**
 * 判断消息是否为重启消息
 * @param message 要检查的消息
 */
export function isRestart(message: any): message is Restart {
  return message && message.type === 'Restart';
}

/**
 * Actor 终止消息
 */
export interface Terminated {
  type: 'Terminated';
  who: PID;
}

/**
 * 判断消息是否为终止消息
 * @param message 要检查的消息
 */
export function isTerminated(message: any): message is Terminated {
  return message && message.type === 'Terminated' && message.who instanceof PID;
}

/**
 * Actor 监视消息
 */
export interface Watch {
  type: 'Watch';
  watcher: PID;
}

/**
 * 判断消息是否为监视消息
 * @param message 要检查的消息
 */
export function isWatch(message: any): message is Watch {
  return message && message.type === 'Watch' && message.watcher instanceof PID;
}

/**
 * Actor 取消监视消息
 */
export interface Unwatch {
  type: 'Unwatch';
  watcher: PID;
}

/**
 * 判断消息是否为取消监视消息
 * @param message 要检查的消息
 */
export function isUnwatch(message: any): message is Unwatch {
  return message && message.type === 'Unwatch' && message.watcher instanceof PID;
}

/**
 * 创建停止消息
 */
export function createStopMessage(): Stop {
  return { type: 'Stop' };
}

/**
 * 创建启动消息
 */
export function createStartedMessage(): Started {
  return { type: 'Started' };
}

/**
 * 创建重启消息
 * @param reason 重启原因
 */
export function createRestartMessage(reason?: Error): Restart {
  return { type: 'Restart', reason };
}

/**
 * 创建终止消息
 * @param who 终止的 PID
 */
export function createTerminatedMessage(who: PID): Terminated {
  return { type: 'Terminated', who };
}

/**
 * 创建监视消息
 * @param watcher 监视者的 PID
 */
export function createWatchMessage(watcher: PID): Watch {
  return { type: 'Watch', watcher };
}

/**
 * 创建取消监视消息
 * @param watcher 取消监视者的 PID
 */
export function createUnwatchMessage(watcher: PID): Unwatch {
  return { type: 'Unwatch', watcher };
} 